/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.segu.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.EmpresaManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.PropietarioManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.segu.dto.UsuarioDto;
import com.brain.segu.manager.UsuarioManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("loginMBean")
@Scope("request")
public class LoginMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(LoginMBean.class);
    private String usuario;
    private String contrasena;
    @Resource
    private UsuarioManager usuarioManager;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private EmpresaManager empresaManager;
    @Resource
    private PropietarioManager propietarioManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    @Autowired
    private RecursosManager recursosManager;

    private List<EmpresaDto> listaEmpresas;
    private EmpresaDto empresaDto;
    public String ingresar() {


        if (validarUsuario()) {
            //enviarEmail();
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            this.sessionMBean.setSessionTerminal(request.getRemoteAddr());
            sessionMBean.setMensajeExpiraSession("");
            request.getSession().setAttribute("terminal", request.getRemoteAddr());
                 return "/inicio.xhtml";
        } else {
            return null;
        }

    }

    private boolean validarUsuario() {


        this.sessionMBean.setSessionUsuarioDto(null);

        UsuarioDto usuarioDto = usuarioManager.login(this.usuario, UtilCore.Seguridad.encriptarTexto(this.contrasena.toUpperCase()).toUpperCase(), this.empresaDto.getId());
        if (usuarioDto != null) {

            //Verificamos si está inactivo el usuario
            if (usuarioDto.getEstado()) {

                //Verificamos si está bloqueado el usuario
                if (usuarioDto.getBloqueado()) {
                    String msj = UtilCore.Internacionalizacion.getMensajeInternacional("login.validacion.bloqueado", usuarioDto.getDescripcion().toUpperCase());
                    showWarning(msj);
                    return false;
                } else {

                    this.sessionMBean.setSessionUsuarioDto(usuarioDto);
                    this.sessionMBean.setPrivilegiosOpciones(usuarioManager.obtenerPrivilegiosUsuario(usuarioDto));

                    /*Cargamos las organizaciones disponibles del usuario*/
                    try {
                        this.sessionMBean.setListaOrganizacionesUsuario(propietarioManager.obtenerOrganizacionesPropietarias(usuarioManager.getIdEntidad(), usuarioDto.getId()));
                    } catch (DAOException ex) {
                        logger.error(ex);
                    }
                    //Validamos si existen organizaciones del usuario
                    boolean existenOrganizaciones = false;

                    if (this.sessionMBean.getListaOrganizacionesUsuario() != null && this.sessionMBean.getListaOrganizacionesUsuario().size() > 0) {
                        existenOrganizaciones = true;
                        //Obtenemos la organizacion principal del usuario
                        for(OrganizacionDto x:this.sessionMBean.getListaOrganizacionesUsuario()){
                            if(x.getPrincipal()){
                               sessionMBean.setOrganizacionDto(x); 
                            }
                        }
                        //sessionMBean.setOrganizacionDto(this.sessionMBean.getListaOrganizacionesUsuario().get(0));
                        try {
                            sessionMBean.setEmpresaDto(empresaManager.obtenerPorId(usuarioDto.getEmpresa()));
                        } catch (DAOException ex) {
                            logger.error(ex);
                        }
                        sessionMBean.setListaEmpresas(new ArrayList<EmpresaDto>());
                        sessionMBean.getListaEmpresas().add(sessionMBean.getEmpresaDto());

                    }
                    //Solo para el usuario SYSTEM (rol=0) 
                    if (usuarioDto.equals(usuarioManager.getUsuarioSystem())) {
                        existenOrganizaciones = true;
                        try {
                            sessionMBean.setListaEmpresas(empresaManager.obtenerActivos());
                            sessionMBean.setEmpresaDto(empresaManager.obtenerPorId(this.empresaDto.getId()));
                            List<OrganizacionDto> lst = organizacionManager.obtenerActivosPorEmpresa(new EmpresaDto(this.empresaDto.getId()));
                            sessionMBean.setListaOrganizacionesUsuario(lst);
                            sessionMBean.setOrganizacionDto(lst.get(0));
                        } catch (DAOException ex) {
                            logger.error(ex);
                        }
                    }

//                    //Usuario cuyo rol tiene el flag "USUARIO_DEFAULT" activado
//                    if (usuarioDto.getRolDto().getUsuarioDefault()) {
//                        existenOrganizaciones = true;
//                        try {
//                            List<OrganizacionDto> lstOrg = organizacionManager.obtenerActivosPorEmpresa(new EmpresaDto(usuarioDto.getEmpresa()));
//                            sessionMBean.setListaOrganizacionesUsuario(lstOrg);
//                            sessionMBean.setOrganizacionDto(organizacionManager.obtenerPorId(lstOrg.get(0).getId()));
//                        } catch (DAOException ex) {
//                            logger.error(ex);
//                        }
//                    }

                    if (existenOrganizaciones) {
                        String msj = UtilCore.Internacionalizacion.getMensajeInternacional("login.validacion.ok", usuarioDto.getDescripcion().toUpperCase());
                        sessionMBean.setEmpresaDto(new EmpresaDto(this.empresaDto.getId()));
                        //Cargamos el Menu del Sistema en la session
                        SessionMBean menuMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
                        menuMBean.cargarMenuBar();
                        try {
                            if (usuarioDto.getEmpresa() != null) {
                                sessionMBean.setEmpresaDto(empresaManager.obtenerPorId(this.empresaDto.getId()));
                            }
                        } catch (DAOException ex) {
                            logger.error(ex);
                        }
                        showMessage(msj);
                        return true;
                    } else {
                        String msj = UtilCore.Internacionalizacion.getMensajeInternacional("login.validacion.organizaciones", usuarioDto.getDescripcion().toUpperCase());
                        showWarning(msj);
                        return false;
                    }
                }
            } else {
                String msj = UtilCore.Internacionalizacion.getMensajeInternacional("login.validacion.inactivo", usuarioDto.getDescripcion().toUpperCase());
                showWarning(msj);
                return false;
            }


        } else {
            String msj = UtilCore.Internacionalizacion.getMensajeInternacional("login.validacion.error");
            showError(msj);
            return false;
        }
    }

    public String cerrarSession() {
        this.sessionMBean.setSessionUsuarioDto(null);
        this.sessionMBean.setSessionTerminal(null);
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        request.getSession().removeAttribute("terminal");

        request.getSession().invalidate();
        sessionMBean.setMensajeExpiraSession("");
        return "/login";
    }

    public String getContrasena() {
        return contrasena;
    }

    public void setContrasena(String contrasena) {
        this.contrasena = contrasena;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        LoginMBean.logger = logger;
    }

    public UsuarioManager getUsuarioManager() {
        return usuarioManager;
    }

    public void setUsuarioManager(UsuarioManager usuarioManager) {
        this.usuarioManager = usuarioManager;
    }

    public OrganizacionManager getOrganizacionManager() {
        return organizacionManager;
    }

    public void setOrganizacionManager(OrganizacionManager organizacionManager) {
        this.organizacionManager = organizacionManager;
    }

    public EmpresaManager getEmpresaManager() {
        return empresaManager;
    }

    public void setEmpresaManager(EmpresaManager empresaManager) {
        this.empresaManager = empresaManager;
    }

    public PropietarioManager getPropietarioManager() {
        return propietarioManager;
    }

    public void setPropietarioManager(PropietarioManager propietarioManager) {
        this.propietarioManager = propietarioManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public List<EmpresaDto> getListaEmpresas() throws DAOException {
        return empresaManager.obtenerActivos();
    }

    public void setListaEmpresas(List<EmpresaDto> listaEmpresas) {
        this.listaEmpresas = listaEmpresas;
    }

    public EmpresaDto getEmpresaDto() {
        return empresaDto;
    }

    public void setEmpresaDto(EmpresaDto empresaDto) {
        this.empresaDto = empresaDto;
    }
}
